<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 1. prototype
    每个函数都有一个prototype属性，被称为显示原型
    2._ _proto_ _
    每个实例对象都会有_ _proto_ _属性,其被称为隐式原型
    每一个实例对象的隐式原型_ _proto_ _属性指向自身构造函数的显式原型prototype
    3. constructor
    每个prototype原型都有一个constructor属性，指向它关联的构造函数。
    4. 原型链
    获取对象属性时，如果对象本身没有这个属性，那就会去他的原型_ _proto_ _上去找，如果还查不到，就去找原型的原型，一直找到最顶层(Object.prototype)为止。Object.prototype对象也有_
    _proto_ _属性值为null。 -->
</head>

<body>

</body>
<script>
    // 什么是原型链
    //什么是原型链?-实例对象(new出的对象)与原型之间的连接关系
    //  原型链概念:在获取对象属性时，如果对象本身没有这个属性，那就会去他的原型__proto__上去找，如果还查不到，就去找原型的原型，一直找到最顶层(Object.prototype)为止。Object.prototype对象也有__proto__属性值为null。
    var arr = [1, 2, 3, 4];//字面量
    var json = {}
    var add = new Array(1, 2);//实例化方式
    var zxc = ''
    // 如果对象下有constructor属性 ，可以获取到构造函数
    console.log(arr.constructor) //Array
    console.log(json.constructor) //Object
    console.log(zxc.constructor) //String


    //可查看构造函数属性
    console.dir(Array);
    //构造函数原型上的方法
    console.log(Array.prototype)
    console.log(String.prototype)
    console.log(Object.prototype)

    // 当访问一个对象的某个属性时，
    // 会先在这个对象本身属性上查找，
    // 如果没有找到，则会去它的__proto__隐式原型上查找，
    // 即它的构造函数的prototype，
    // 如果还没有找到就会再在构造函数的prototype的__proto__中查找，这样一层一层向上查找就会形成一个链式结构，我们称为原型链。



    // 在JavaScript中，每个函数都有一个prototype属性，这个属性指向函数的原型对象。
    function Parent(month) {
        this.month = month;
    }
    var child = new Parent('Ann');
    console.log(child.month); // Ann
    console.log(child.father); // undefined

    // 一直往上层查找，直到到null还没有找到，则返回undefined 
    console.log(Object.prototype.__proto__ == null) //true


    // 这是每个对象(除null外)都会有的属性，叫做__proto__，这个属性会指向该对象的原型。
    function Person() {
    }
    var person = new Person();

    console.log(person.__proto__ === Person.prototype); // true

</script>

</html>